python socket

1. python socket的简单例子

服务端的通信过程: socket—>bind—>listen(连接请求)—>accept—>send(发送数据)—>recv(接受数据)—>close 客户端的通信过程: socket—>bind(可选)—>connect(连接服务器)—>sends(发送数据)—>recv(接受数据)—>close 下面是一个简单的服务端客户端的实现: server.py:

#!/usr/bin/python
#encoding=utf-8
 
import socket
 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#第一个参数AF_INET,AF_INET6,AF_UNIX默认AF_INET,第二个参数有SOCK_STREAM和SOCK_DGRAM
#默认为SOCK_STREAM流套接字提供双向有序且不重复的数据服务也可以直接写s=socket.socket()
 
#host = socket.gethostname()
host = ''
port = 1234
s.bind((host, port)) #绑定socket地址只有一个参数 是一个地址+端口的元组
 
s.listen(10) #开始监听,参数是队列长度
 
while True:
    c, addr = s.accept() #接受一个连接
 
    print 'Get connection from', addr
    c.send('This is a simple server') #发送数据
    print c.recv(1024) #读取数据
    c.close()

client.py:

view sourceprint?
#!/usr/bin/python
#encoding=utf-8
 
import socket
 
s = socket.socket() #生成一个socket对象
 
server = socket.gethostname()
print server
port = 1234 #一般1024以下端口号可能会有权限限制
s.connect((server, port)) #连接服务器
print s.recv(1024) #读取数据
 
say = raw_input(u'说点什么...'.encode('gbk'))
s.send(str(say))
 
s.close() #关闭连接

2. python实现socket通讯(TCP)

Server

# server

import socket

address = ('127.0.0.1', 31500)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # s = socket.socket()
s.bind(address)
s.listen(5)

ss, addr = s.accept()
print 'got connected from',addr

ss.send('byebye')
ra = ss.recv(512)
print ra

ss.close()
s.close()

Client

# client

import socket

address = ('127.0.0.1', 31500)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(address)

data = s.recv(512)
print 'the data received is',data

s.send('hihi')

s.close()

运行结果:

server
[work@db-testing-com06-vm3.db01.baidu.com python]$ python server.py 
got connected from ('127.0.0.1', 47872)
hihi
 
client
[work@db-testing-com06-vm3.db01.baidu.com python]$ python client.py 
the data received is byebye

参考资料:http://www.cppblog.com/lai3d/archive/2008/02/19/42919.html 一个简单的服务器和客户端通信的例子 服务器:

import socket
s=socket.socket()
s.bind(('xxx.xxx.xxx.xxx',xxxx))    #ip地址和端口号
s.listen(5)
cs,address = s.accept()
print 'got connected from',address
cs.send('byebye')
ra=cs.recv(512)
print ra
cs.close()

客户端:

import socket
s=socket.socket()
s.connect(('xxx.xxx.xxx.xxx',xxxx))   #与服务器程序ip地址和端口号相同
data=s.recv(512)
s.send('hihi')
s.close()
print 'the data received is',data

运行: 在本机测试(windows环境下,可以将ip地址改为本机ip,端口号在1024以上,windows将1024以下的为保留),运行--CMD--进入命令行模式 先python 服务器程序,后python 客户端程序即可。 或者启动服务器程序后,用telnet ip地址 端口号,也可以得到同样结果。 让server持续接受连接 server.py

import socket
s=socket.socket()
s.bind(('192.168.43.137',2000))
s.listen(5)

while 1:
    cs,address = s.accept()
    print 'got connected from',address
    cs.send('hello I am server,welcome')
    ra=cs.recv(512)
    print ra
    cs.close()

测试两个一个程序中两个socket并存是否可行 client.py

import socket
s=socket.socket()
s.connect(('192.168.43.137',2000))   
data=s.recv(512)
print 'the data received is/n    ',data
s.send('hihi I am client')

sock2 = socket.socket()
sock2.connect(('192.168.43.137',2000))
data2=sock2.recv(512)
print 'the data received from server is/n   ',data2
sock2.send('client send use sock2')
sock2.close()

s.close()